1 package org.votech.ds6.plastlets;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.net.URL;
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.HashSet;
9 import java.util.List;
10 import java.util.Set;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.astrogrid.acr.builtin.ACR;
15 import org.jdesktop.jdic.desktop.Desktop;
16 import org.jdesktop.jdic.desktop.DesktopException;
17 import org.jdesktop.jdic.desktop.Message;
18 import org.votech.plastic.PlasticHubListener;
19 import org.votech.plastic.managers.AcrManager;
20 import org.votech.plastic.managers.PlasticManager;
21 import org.votech.plastic.managers.AcrManager.AcrObserver;
22 import org.votech.plastic.managers.PlasticManager.PlasticHubObserver;
23 /***
24 * Manages creation and registration of Plastlets.
25 * @author jdt
26 *
27 */
28 public class PlastletsManager implements PlasticHubObserver, AcrObserver {
29
30 public interface PlastletChangeListener {
31 void plastletsChanged();
32 }
33 private List<PlastletChangeListener> listeners = new ArrayList<PlastletChangeListener>();
34 public PlastletsManager(AcrManager acrManager, PlasticManager plasticManager) {
35 this.acrManager = acrManager;
36 this.plasticManager = plasticManager;
37 plasticManager.addObserver(plasticManager.new ObserverAdaptor(this));
38 acrManager.addObserver(acrManager.new ObserverAdaptor(this));
39 }
40 public void add(PlastletChangeListener listener) {
41 listeners.add(listener);
42 }
43 private void notifyListeners() {
44 for (PlastletChangeListener l : listeners) {
45 l.plastletsChanged();
46 }
47 }
48
49
50 /***
51 * Logger for this class
52 */
53 private static final Log logger = LogFactory.getLog(PlastletsManager.class);
54
55 private PlasticManager plasticManager;
56
57 private Set<Plastlet> jdicPlastlets = new HashSet<Plastlet>();
58 private Set<Plastlet> acrPlastlets = new HashSet<Plastlet>();
59
60 private AcrManager acrManager;
61
62
63
64
65 public boolean enablePlastlet(Plastlet plastlet, boolean enable) {
66 Collection<Plastlet> plastlets = getPlastlets();
67 if (!plastlets.contains(plastlet)) return false;
68 final PlasticHubListener hub = plasticManager.getHub();
69 if (hub==null) return false;
70 boolean success;
71 if (enable) {
72 success = plastlet.register(hub);
73 } else {
74 success = plastlet.unregister();
75 }
76 return success;
77 }
78
79 public Collection<Plastlet> getPlastlets() {
80 Set<Plastlet> allPlastlets = new HashSet<Plastlet>(acrPlastlets);
81 allPlastlets.addAll(jdicPlastlets);
82 return allPlastlets;
83 }
84
85 private void unregisterAllPlastlets() {
86 logger.debug("Unregistering all plastlets");
87 unregisterPlastlets(jdicPlastlets);
88 unregisterPlastlets(acrPlastlets);
89 }
90
91
92
93 private void unregisterPlastlets(Collection<Plastlet> plastlets) {
94 if (plasticManager.isConnected()) {
95 for (Plastlet plastlet : plastlets) {
96 plastlet.unregister();
97 }
98 }
99 plastlets.clear();
100 }
101
102 public void createAndRegisterAllPlastlets() {
103 logger.debug("Creating all Plastlets");
104 if (!plasticManager.isConnected()) {
105 logger.warn("PlastletManager's PlasticManager isn't connected. Cannot register plastlets.");
106 return;
107 }
108
109 createAndRegisterJdicPlastlets();
110 createAndRegisterAcrPlastlets();
111 }
112
113
114
115 private synchronized void createAndRegisterJdicPlastlets() {
116 createJdicPlastlets();
117 registerPlastlets(jdicPlastlets);
118 }
119
120
121
122 private synchronized void createAndRegisterAcrPlastlets() {
123 createACRPlastlets();
124 registerPlastlets(acrPlastlets);
125 }
126
127
128
129 private void createJdicPlastlets() {
130 Set<Plastlet> oldJdicPlastlets = new HashSet<Plastlet>(jdicPlastlets);
131
132
133
134 if (CheckJDICPresent.desktop.check()) {
135
136
137 Plastlet browserPlastlet = new BrowserPlastlet(new BrowserPlastlet.BrowserControl() {
138
139 public boolean openURL(URL url) {
140 try {
141 Desktop.browse(url);
142 } catch (DesktopException e) {
143 logger.error("Unable to open url "+url+" in the system browser",e);
144 }
145 return true;
146 }
147
148 }, plasticManager.getId());
149 jdicPlastlets.add(browserPlastlet);
150
151
152
153 Plastlet emailPlastlet = new EmailPlastlet(plasticManager.getId(), new EmailPlastlet.Mailer() {
154
155 public void mail(EmailPlastlet.Message message) throws DesktopException {
156
157 Message jdicMessage = new Message();
158 jdicMessage.setSubject(message.getSubject());
159 jdicMessage.setBody(message.getBody());
160 try {
161 jdicMessage.setAttachments(message.getAttachments());
162 } catch (IOException e) {
163 logger.warn("One of the attached files was not readable, ignoring", e);
164 jdicMessage.setBody("Unable to attach file");
165 }
166 Desktop.mail(jdicMessage);
167
168 }
169
170 });
171
172 jdicPlastlets.add(emailPlastlet);
173
174
175 Plastlet printPlastlet = new PrintPlastlet(plasticManager.getId(), new PrintPlastlet.Printer() {
176
177 public void print(File file) throws Exception {
178 Desktop.print(file);
179 }
180 });
181 jdicPlastlets.add(printPlastlet);
182
183
184 }
185 if (!oldJdicPlastlets.equals(jdicPlastlets)) notifyListeners();
186 }
187
188
189
190 private void registerPlastlets(Collection<Plastlet> plastlets) {
191 final PlasticHubListener hub = plasticManager.getHub();
192 if (hub==null) {
193 logger.debug("Failed to register plastlets - hub not ready");
194 return;
195 }
196
197 Collection<Plastlet> toRemove = new HashSet<Plastlet>();
198
199 for (Plastlet plastlet : plastlets) {
200 boolean success;
201 try {
202
203 success = plastlet.register(hub);
204 } catch (RuntimeException e) {
205 logger.warn("Error when try to register plastlet "+plastlet.getMetaData().getName(),e);
206 success=false;
207 }
208 if (!success) {
209
210 toRemove.add(plastlet);
211 }
212 }
213 logger.debug("Created plastlets: "+plastlets.size());
214 logger.debug("Removing: "+toRemove.size());
215 plastlets.removeAll(toRemove);
216 logger.debug("Leaving: "+plastlets.size());
217 }
218
219
220
221 private void createACRPlastlets() {
222 if (!acrManager.isConnected()) return;
223
224 Set<Plastlet> oldAcrPlastlets = new HashSet<Plastlet>(acrPlastlets);
225
226 ACR acr = acrManager.getAcr();
227
228 Plastlet savePlastlet = new SaveToMySpacePlastlet(plasticManager.getId(),acr);
229 acrPlastlets.add(savePlastlet);
230
231 if (!oldAcrPlastlets.equals(acrPlastlets)) {
232 notifyListeners();
233 }
234 }
235
236 public void hubUp(PlasticHubListener hub) {
237 logger.info("Hub started");
238 createAndRegisterAllPlastlets();
239 }
240
241 public void hubDown() {
242 logger.info("Hub stopped");
243 unregisterAllPlastlets();
244 acrPlastlets.clear();
245 jdicPlastlets.clear();
246 notifyListeners();
247 }
248
249
250
251 public void acrUp() {
252 logger.info("ACR Up");
253 createAndRegisterAcrPlastlets();
254 }
255
256
257
258 public void acrDown() {
259 logger.info("ACR Down");
260 Set<Plastlet> oldAcrPlastlets = new HashSet<Plastlet>(acrPlastlets);
261 unregisterPlastlets(acrPlastlets);
262 acrPlastlets.clear();
263 if (!oldAcrPlastlets.equals(acrPlastlets)) notifyListeners();
264 }
265 public void shutDown() {
266 unregisterAllPlastlets();
267 plasticManager.disconnect();
268 }
269 public PlasticManager getPlasticManager() {
270 return plasticManager;
271 }
272 public AcrManager getAcrManager() {
273 return acrManager;
274 }
275
276 }